package com.wind.C_PublishSubscribe;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * WorkQueues 发送者
 * @author Windy
 * @date 2021年3月2日 21:53:20
 */
public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置参数
        factory.setHost("127.0.0.1");   // RabbitMQ Server IP，默认是 localhost
        factory.setPort(5672);          // RabbitMQ Server Port，默认是5672
        factory.setVirtualHost("/wind");// 指定虚拟机，默认是 / （只有一个默认时可以省略，两个的话 得指定一个~！）
        factory.setUsername("wind");
        factory.setPassword("wind");
        // 3. 创建Connection连接
        Connection connection = factory.newConnection();
        // 4. 创建Channel管道
        Channel channel = connection.createChannel();
        // 5. 创建Exchange交换机
        /*
            exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
            参数：
                exchange：交换机名称。
                type：枚举类 交换机类型。
                    DIRECT("direct"),       定向
                    FANOUT("fanout"),       扇形（广播）
                    TOPIC("topic"),         通配符（自定义）
                    HEADERS("headers");     参数匹配
                durable：持久化。
                autoDelete：自动删除。
                internal：内部的，指的是ErLang语言内调用。
                arguments：参数。
         */
        String exchangeName = "test_fanout";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT, true, false, false, null);
        // 6. 创建Queue队列 2个
        String queueName1 = "test_fanout_queue1";
        String queueName2 = "test_fanout_queue2";
        channel.queueDeclare(queueName1, true, false, false, null);
        channel.queueDeclare(queueName2, true, false, false, null);
        // 7. 交换机Bind绑定队列
        /*
            queueBind(String queue, String exchange, String routingKey)
            参数：
                queue：队列名称。
                exchange：交换机名称。
                routingKey：路由名称。（如果交换机类型为 fanout 则routingKey设置为 "" 空字符串）
         */
        channel.queueBind(queueName1, exchangeName, "");
        channel.queueBind(queueName2, exchangeName, "");
        // 6. 发送Message消息
        for (int i = 1; i <= 10; i++) {
            String body = i + "日志信息：张三丰调用了findAll()方法 ~~，日志级别为info~~~！";
            channel.basicPublish(exchangeName, "", null, body.getBytes());
        }
        // 7. 关闭连接
        channel.close();
        connection.close();
    }
}
